#ifndef clox_obj_h
#define clox_obj_h

#include "hash_table.h"

typedef struct Chunk Chunk;

typedef enum {
    OBJ_STRING,
    OBJ_FUNCTION
} ObjType;

typedef struct Obj {
    ObjType type;
} Obj;

typedef struct {
    Obj obj;
    int len;
    char* val;
} ObjString;

typedef struct {
    Obj obj;
    Chunk chunk;
    int arity;
    ObjString* name;
} ObjFunction;

typedef struct {
    int ip;
    int ebp; // 栈顶
    ObjFunction* fun;
} CallFrame;

ObjString* objStringCreate(const char* str, int len, HashTable* table);
int strHash(void* key);
int objStrHash(void* key);
int objStrCompare(void* val1, void* val2);
ObjFunction* objFunctionCreate(const char* str, int len, HashTable* table);
void callFrameInit(CallFrame* frame, ObjFunction* fun, int ebp);

#endif
